package wang_wen_wen;

import java.util.Scanner;

public class WANG_WEN_WEN_TH_Q2 {
        /*
        用数组模拟堆栈：
        首先我们要什么（定义）：堆栈有头指针，还有最大容量，因此我们要创建front,maxSize变量，判断队列中数据个数num，
        再定义一个数组用来模拟堆栈
        再然后我们要做什么（方法）：创建一个队列，进行增删查及队列复用
        并测试效果
        重点：增加就是头指针向后移动，并给该下标的数组赋值，但是要注意是否到最大值，判断堆栈满能直接this.length==array.length，
                  删除（取出数据）就是头指针向前移，如果是取出就可以再加一个返回该数组下标的值，删除则可以不返回，但是要注意判断该堆栈是否为空this.leng==0.
                  查找（显示数据）就是从头指针开始遍历，int i=front,i<=this.length,i++
        注意：判断为空就是判断 数组实际长度是否为0 this.length==0
                  判断堆栈满要 this.length==array.length
        */
        public static void main(String[] args){
            //创建一个堆栈
            ArrayDui arrQueue = new ArrayDui(3);
            char key = ' ';
            //接收输入
            Scanner scanner = new Scanner(System.in);
            boolean loop = true;
            //默认一个循环，死循环
            //输出一个菜单
            while(loop){
                System.out.println("s(show):显示堆栈");
                System.out.println("e(exit):退出程序");
                System.out.println("a(add):添加数据到堆栈");
                System.out.println("d(delete):从堆栈取出数据");
                System.out.println("h(head):查看堆栈头的数据");
                key = scanner.next().charAt(0);
                //接收一个字符
                switch(key){
                    case's':
                        arrQueue.showQueue();
                        break;
                    case'e':
                        scanner.close();
                        loop = false;
                        break;
                    case'a':
                        System.out.println("输入一个数：");
                        int value = scanner.nextInt();
                        arrQueue.addQueue(value);
                        break;
                    case'd':
                        try{
                            int res = arrQueue.deleteQueue();
                            System.out.println("取出的数据是："+res);
                        }catch(Exception e){
                            System.out.println(e.getMessage());
                        }
                        break;
                    case'h':
                        try{
                            int res = arrQueue.headQueue();
                            System.out.println("堆栈头的数据是："+res);
                        }catch(Exception e){
                            System.out.println(e.getMessage());
                        }
                        break;
                    default:
                        break;
                }
            }
            System.out.println("退出成功！");
        }
    }
    class ArrayDui{
        private int maxSize;//表示数组的最大容量
        private int front;//堆栈头
        private int[] arr;//该数组用于存放数据，模拟堆栈
        private int length;//数组实际长度

        private int getLength(){
            return this.length;
        }
        //创建队列
        public ArrayDui(int arrMaxSize){
            maxSize = arrMaxSize;
            arr = new int[maxSize];
            front = 0;//指向队列头部，分析出front是指向队列头部的前一个位置
        }
        //判断队列是否满
        public boolean isFull(){
            return this.length==arr.length;
        }
        //判断队列是否空
        public boolean isEmpty(){
            return this.length==0;
        }
        //添加数据到队列
        public boolean addQueue(int n){
            if(isFull()){
                System.out.println("堆栈满，加入失败");
                return false;
            }
            //直接将数据加入
            arr[front] = n;
            //将front后移
            front=front+1;
            this.length++;
            return true;
        }
        //显示队列的所有数据
        public void showQueue(){
            //遍历
            if(isEmpty()){
                System.out.println("堆栈空");
                return;
            }
            for(int i = front-1;i >=0;i--){
                System.out.println("arr["+i+"]="+arr[i]);
            }
        }
        //删除数据就是取出数据
        public int deleteQueue(){
            if(isEmpty()){
                throw new RuntimeException("堆栈空，不能取数组");
            }
            //直接将front前移
            int number = arr[front-1];
            arr[front]=0;
            front =front-1;//让front前移
            this.length--;
            return number;
        }
        //显示堆栈的头部数据，不是取数据
        public int headQueue(){
            //判断
            if(isEmpty()){
                //System.out.println("队列空");
                throw new RuntimeException("堆栈空");
            }
            return arr[front-1];
        }
    }



